package com.xf.day03.ClassAndObject

/**
 * 在 Scala 中，当一个类（class）和一个单例对象（object）同名且在同一个文件中定义时，
 * 它们互为伴生关系。这种关系允许它们互相访问对方的私有成员
 */

// 伴生类
class Person private( val name:String, private val age:Int) {

  // 访问伴生对象的 私有成员的方法
  def description:String = s"$name is $age years old. ${Person.secretMessage}"

  // 私有方法, 但 伴生对象 可以访问
  private def getDetail:String = s"Name: $name, Age: $age"

  // 实例方法
  def greet(): Unit = {
    println(s"Hello, my name is $name")
  }
}

// 伴生对象
object Person {

  // 私有成员, 但伴生类可以访问
  private val secretMessage = "This is a secret!"

  // 工厂方法,  创建 Person 实例的主要方式
  def apply( name:String, age:Int ): Person = {
    // 可以访问 伴生类 的私有构造函数
    new Person(name, age)
  }

  // 重载的工厂方法
  def apply( name: String): Person = {
    new Person(name, 0)
  }

  // 访问 伴生类的 私有方法
  def showDetails(persion:Person): String = {
    persion.getDetail
  }

  // 静态方法 在 伴生对象中定义
  def staticMethod(): String = {
    "This is a static method from the companion object"
  }

  // 常量
  val Species: String = "Homo sapiens"


}